package com.syl.auth.loginlogic.base;

import com.syl.auth.model.SmallUserInfo;
import com.syl.auth.model.LoginData;

/**
 * @ClassName AbstractLoginLogic
 * @Description 自定义认证逻辑抽象类
 * 此部分逻辑拟采用工厂+策略+模板模式。
 * 后续需要扩展登录方式时：
 * 1. 增加需要的登录参数
 * 2. 写一个子类继承此类，重写此类的方法即可。
 * @Author YunLong
 * @Date 2023/4/27 21:52
 */
public abstract class AbstractLoginLogic {
    /**
     * @Author YunLong
     * @Date 2023/4/27 21:55
     * @Description 最最最最核心的流程，编排一下下
     **/
    public SmallUserInfo authenticate(LoginData loginData) {

        beforeLogin(loginData);

        login(loginData);

        SmallUserInfo userDetails = getUserDetails(loginData);

        afterLogin(userDetails);

        return userDetails;
    }

    /**
     * @Author YunLong
     * @Date 2023/4/27 21:55
     * @Description 获取本类支持的登录方式
     **/
    public abstract String getSupportLoginType();

    /**
     * @Author YunLong
     * @Date 2023/4/27 21:55
     * @Description 登陆后逻辑，后置操作
     **/
    protected abstract void afterLogin(SmallUserInfo userDetails);

    /**
     * @Author YunLong
     * @Date 2023/4/27 21:55
     * @Description 获取用户信息详情
     **/
    protected abstract SmallUserInfo getUserDetails(LoginData loginData);

    /**
     * @Author YunLong
     * @Date 2023/4/27 21:55
     * @Description 登录逻辑
     **/
    protected abstract void login(LoginData loginData);

    /**
     * @Author YunLong
     * @Date 2023/4/27 22:06
     * @Description 登录方式对应参数的校验
     **/
    protected abstract void beforeLogin(LoginData loginData) ;
}
